Kong Gatewayのプラグインを活用してLambdaのルートにCognitoでOIDC認証を導入してみる
APIの管理を効率化したい えがわ です。
本記事は「Kong Advent Calendar 2024」の19日目のエントリとして、Kong GatewayのLambdaのルートにCognitoのOpenID Connect(以下OIDC)認証を導入します。
前回の記事でKong Gatewayのプラグインを使用してLambdaを実行してみました。
今回は前回作成したルートにCognitoを使用したOIDC認証を導入してみます。
環境
- kong Konnect
- Kong Gateway 3.8
- EC2: Amazon Linux 2023
- Lambda: Python 3.13
- Cognito
やってみる
Kong GatewayからLambdaを実行するところまでは以下のブログをご確認ください。
認証の都合上、本記事ではKong Gatewayを起動しているEC2で動作確認を行います。
現状の確認
現状のルートを確認しておきます。
[ec2-user@ip-10-0-11-92 ~]$ curl http://localhost:8000/lambda
{"statusCode":200,"body":"\"Hello from Lambda!\""}
このルートに認証を追加します。
Cognitoの設定
Amazon Cognitoに遷移しユーザープールとアプリケーションを作成します。
ユーザープールとアプリケーションクライアントが作成されました。
アプリケーションクライアントを設定していきます。
ログインページを編集します。
許可されているコールバック URLに以下を設定します。
- https://kong-ee:8446/default
- https://kong-ee:8447/default/
- https://kong-ee:8447/default/auth
- https://kong-ee:8443/cognito
- http://localhost:8000/lambda
OpenID Connect のスコープにaws.cognito.signin.user.admin
とプロファイル
を選択します。
Cognitoの設定は完了ですが、確認する項目があるので、ページは閉じないようにしてください。
Kongプラグインの設定
LambdaのルートでOIDCプラグインを有効にします。
OpenID Connectプラグインを選択します。
項目 | 値 |
---|---|
Client Id | CognitoクライアントアプリケーションのID |
Client Secret | Cognitoクライアントアプリケーションのシークレット |
Issuer | ※OIDC検出エンドポイント |
※CognitoのOIDC検出エンドポイントは以下を置き換えてください。
https://cognito-idp.{リージョン}.amazonaws.com/{ユーザープールID}/.well-known/openid-configuration
OIDCプラグインの設定はこちらで完了です。
動作確認
リクエストを送ってみます。
curl -i http://localhost:8000/lambda
HTTP/1.1 302 Moved Temporarily
Date: Wed, 18 Dec 2024 07:00:08 GMT
Connection: keep-alive
Cache-Control: no-store
Set-Cookie: authorization=AQAAND2mD... Path=/; SameSite=Default; HttpOnly
Location: https://us-east-1...auth.us-east-1.amazoncognito.com/oauth2/authorize?redirect_uri=...&response_type=code&scope=openid&state=...&response_mode=query&client_id=...&nonce=...
Content-Length: 0
X-Kong-Response-Latency: 2
Server: kong/3.8.0.0-enterprise-edition
X-Kong-Request-Id: 7929a8009047603e12cc9c41256e520d
ルートにOIDCの認証が追加されています。
LocationのURLにブラウザでアクセスします。
アカウントを作成しリダイレクトするとクエリパラメータに認証コードが付与されています。
こちらを使用してアクセストークンを取得します。
COGNITO_DOMAIN={※Cognitoのドメイン}
CLIENT_ID={クライアントID}
CLIENT_SECRET={クライアントシークレット}
REDIRECT_URI=http://localhost:8000/lambda
AUTH_CODE={上記で取得した認証コード}
curl -X POST \
"${COGNITO_DOMAIN}/oauth2/token" \
-H 'Content-Type: application/x-www-form-urlencoded' \
-u "${CLIENT_ID}:${CLIENT_SECRET}" \
-d "grant_type=authorization_code" \
-d "client_id=${CLIENT_ID}" \
-d "code=${AUTH_CODE}" \
-d "redirect_uri=${REDIRECT_URI}"
{"id_token":"{IDトークン}","access_token":"{アクセストークン}","refresh_token":"{リフレッシュトークン}","expires_in":3600,"token_type":"Bearer"}
※Cognitoのドメインはマネジメントコンソールから確認することが可能です。
アクセストークンを取得できたので、リクエストを行います。
ACCESS_TOKEN={アクセストークン}
[ec2-user@ip-10-0-11-92 ~]$ curl -H "Authorization: Bearer ${ACCESS_TOKEN}" \
http://localhost:8000/lambda
{"body":"\"Hello from Lambda!\"","statusCode":200}
リクエストを実行できました。
さいごに
Kongのプラグインを使用することで、アプリケーションに変更を加えずOIDC認証を導入することができました。
認証のプラグインに関してはOIDCだけでなくJWTやLDAPも選択することが可能です。
この記事がどなたかの参考になれば幸いです。